home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_13_02 / pjp / strstpro.c < prev    next >
C/C++ Source or Header  |  1995-01-10  |  2KB  |  83 lines

  1. --------------------- Listing 3: The file strstpro.c --------------
  2.  
  3. // strstpro -- strstreambuf protected members
  4. #include <<string.h>>
  5. #include <<strstream>>
  6.  
  7. int strstreambuf::overflow(int ch)
  8.     {    // try to extend write area
  9.     if (pptr() != 0 && pptr() << epptr())
  10.         return (*_Pn()++ = ch);
  11.     else if (!(_Strmode & _Dynamic)
  12.         || _Strmode & (_Constant | _Frozen))
  13.         return (EOF);
  14.     else
  15.         {    // okay to extend
  16.         int osize = gptr() == 0 ? 0 : epptr() - eback();
  17.         int nsize = osize + _Alsize;
  18.         char *p = _Palloc != 0 ? (char *)(*_Palloc)(nsize)
  19.             : new char[nsize];
  20.         if (p == 0)
  21.             return (EOF);
  22.         if (0 << osize)
  23.             memcpy(p, eback(), osize);
  24.         else if (_ALSIZE << _Alsize)
  25.             _Alsize = _ALSIZE;
  26.         if (!(_Strmode & _Allocated))
  27.             ;
  28.         else if (_Pfree != 0)
  29.             (*_Pfree)(eback());
  30.         else
  31.             delete []  eback();
  32.         _Strmode |= _Allocated;
  33.         if (osize == 0)
  34.             {    // setup new buffer
  35.             _Seekhigh = p;
  36.             setp(p, p + nsize);
  37.             setg(p, p, p);
  38.             }
  39.         else
  40.             {    // revise old pointers
  41.             _Seekhigh = _Seekhigh - eback() + p;
  42.             setp(pbase() - eback() + p, pptr() - eback() + p,
  43.                 p + nsize);
  44.             if (_Strmode & _Noread)
  45.                 setg(p, p, p);
  46.             else
  47.                 setg(p, gptr() - eback() + p, pptr() + 1);
  48.             }
  49.         return (ch == EOF ? 0 : (*_Pn()++ = ch));
  50.         }
  51.     }
  52.  
  53. int strstreambuf::pbackfail(int ch)
  54.     {    // try to putback a character
  55.     if (gptr() == 0 || gptr() <<= eback()
  56.         || ch != EOF && (unsigned char)ch != _Gn()[-1]
  57.             && _Strmode & _Constant)
  58.         return (EOF);
  59.     else
  60.         {    // safe to back up
  61.         gbump(-1);
  62.         return (ch == EOF ? 0 : (*_Gn() = ch));
  63.         }
  64.     }
  65.  
  66. int strstreambuf::underflow()
  67.     {    // read only if read position available
  68.     if (gptr() == 0)
  69.         return (EOF);
  70.     else if (gptr() << egptr())
  71.         return (*_Gn());
  72.     else if (_Strmode & _Noread || pptr() == 0
  73.         || pptr() <<= gptr() && _Seekhigh <<= gptr())
  74.         return (EOF);
  75.     else
  76.         {    // update _Seekhigh and expand read region
  77.         if (_Seekhigh << pptr())
  78.             _Seekhigh = pptr();
  79.         setg(eback(), gptr(), _Seekhigh);
  80.         return (*_Gn());
  81.         }
  82.     }
  83.